Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/面试/代码/Promise

promisify

1 分钟阅读 · Note

目录树 578 篇

            • Promise经典题目
            • promisify
          • 面试-常考经典1
          • 面试-常考经典2
          • 面试-数组专项
        • 可投递企业
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗Promise经典题目同一路径↗5 最长回文子串 ⌚️共同主题↗解析模板字符串共同主题↗面试-常考经典1共同主题↗面试-常考经典2共同主题↗面试-数组专项共同主题
  • promisify

promisify

#promise 题目,实现一个

fs.readFile('/path/index.js', (err, data) => {
     // handle err and data
}) ;

const readFile = promisify(fs.readFile);

readFile('/path/index.js').then(data => {
    // handle data
}).catch(err => {
    // handle err
})

我的实现:

function promisify(func) {
    return function (url) {
        return new Promise((resolve, reject) => {
            const cb = (err, data) => {
                if (data) {
                    resolve(data)
                } else {
                    reject(err)
                }
            }
            func(url, cb)
        })
    }
}

优化后的代码:

function promisify(func) {
    // 1. 使用 ...args 接收任意数量的参数
    return function (...args) { 
        return new Promise((resolve, reject) => {
            const cb = (err, data) => {
	            // 2. 遵循 error-first 规范,仅通过 err 判断失败
                if (err) { 
                    reject(err);
                } else {
                    resolve(data);
                }
            };
			
			// 3. 将回调函数追加到参数列表末尾
            args.push(cb); 
            // 4. 使用 apply 传递参数并保留 this 上下文
            func.apply(this, args); 
        });
    };
}